perm filename CARCON[901,BGB] blob sn#129631 filedate 1974-11-12 generic text, type T, neo UTF8
00100	TITLE CARCON
00200	Q←16
00400	Z←0
00500	CMD←14
00600	OPDEF MAIL [710B8]
00650	OPDEF TTYUUO [51B8]
00675	OPDEF ECHO [TTYUUO 3,]
00700	EXTERNAL EXP
00800	OPDEF FIX6 [120B8]
00900	OPDEF FIX [247B8]
00950	
01000	;CARCON EXPECTS TO RECEIVE COMMAND BUFFERS BY MAIL.
01100	;THE BUFFER FORMAT IS AS FOLLOWS:
01150	
01200	;BUFF:	-WC,,<ignored>
01300	;	<COMMAND1>
01400	;	<COMMAND2>
01500	;	    .
01600	;	    .
01700	;	    .
01800	;	(MAX OF 37 OCTAL COMMANDS)
01850	
01875	
01900	;THE FORMAT OF A <COMMAND> IS AS FOLLOWS:
01950	
02000	;BITS 0-2:	DEVICE BEING COMMANDED
02100	;	1=BACK WHEELS
02200	;	2=CAMERA PAN
02300	;	3=FRONT WHEELS
02400	;	4=DRIVE MOTORS
02450	
02500	;BITS 3-17:	TIME TO WAIT (IN SIXTHS OF A SECOND)
02600	;	BEFORE PICKING UP NEXT <COMMAND>
02650	
02700	;BITS 18-35:	ANGLE COMMANDED
02800	;	FOR THE WHEELS. THIS MUST BE IN THE RANGE
02900	;	+/- 360 DECIMAL. FOR THE CAMERA, THE RANGE
03000	;	IS -90 TO +270, WHERE 0 IS STRAIGHT AHEAD.
03100	;	FOR THE DRIVE, 0 MEANS STOP, AND ANYTHING ELSE
03200	;	MEANS GO.
03225	
03275	
03300	;A HANDY WAY TO COMPUTE THE  POINTER WORD COUNT IS:
03350	
03400	;	MOVE AC,[XWD -40,BUFFER]
03500	;	PUSH AC,<COMMAND1>
03600	;	PUSH AC,<COMMAND2>,etc
03700	;	SETCMM AC
03800	;	SUB AC, [XWD 40,0]
03900	;	MOVEM AC,BUFFER
04000	;NOTE THAT THE WORD COUNT INCLUDES THE WORD CONTAINING THE
04100	;COUNT
04200	;ALSO BE ADVISED THAT RECEIPT OF A NEW BUFFER ABORTS
04300	;EXECUTION OF ANY REMAINING COMMANDS IN THE OLD BUFFER
04400	;THIS IS SO YOU CAN PANIC AND CHANGE YOUR MIND, OR
04500	;STOP THE CART INSTANTLY
     

00100	CARCON:	CALLI
00150		ECHO [ASCIZ /*/]
00200		SETZM JSTOP
00300		SETOM FLAG
00400		SPCWAR 1,ONCE
00500		SKIPE FLAG
00600		JRST .-1
00700		SPCWAR 636367
00800		SPCWAR 1,SPACE
00900	LOOP:	MAIL 1,MBOX
00925		SKIPN MBOX
00975		ECHO [ASCIZ /NULL BUFFER RECEIVED
00980	/]
01000		MOVEI 1,CMDBUF
01100		HRRM 1,MBOX
01125		SKIPE JSTOP
01175		ECHO [ASCIZ /RESTART CARCON
01180	/]
01200		SETOM FLAG
01300		SKIPE FLAG
01400		JRST .-1
01500		JRST LOOP
01600	FLAG:	Z
01700	ONCE:	CONO 700,624054	;STOP THE CART
01800		CONO 700,450050
01900		CONO 700,450055	;SET UP UNUSED DACS
02000		SETZM DRCMD
02100		SETZM FLAG
02200		CALLI
02300	MBOX:	BLOCK 40
02400	CMDBUF:	BLOCK 40
02450	CMDTIM:	Z
02500	JSTOP:	Z
02600	DISMIS:	Z
02700	FRANG:	Z
02800	BKANG:	Z
02900	CAMANG:	Z
03000	DRCMD:	Z
03100	BKW51:	XWD 51,0
03200	CAM52:	XWD 52,0
03300	FRW53:	XWD 53,0
03400	DR54:	XWD 54,0
03500	VSUP:	9.8
03600	VBE:	0.68
03700	RC:	4.76E-3
03800		4.8E-3
03900		5.85E-3
04000	CPULS:	1.791E-3
04100	CPMAX:	2.3E-3
04200		2.27E-3
04300		2.27E-3
04400	EPS:	-0.99
04500		-0.54
04600		-0.7
04700	PULSW:	Z
     

00100	SPACE:	SKIPE 5	;C(5)=-1 MEANS PDP-10 IS DEAD
00200		SETOM JSTOP
00300		SKIPL 6	;C(6)<0 MEANS USER JOB IS DEAD
00400		SETOM JSTOP
00500		SKIPE JSTOP
00600		CALLI
01400		SOSLE DISMIS
01500		CALLI	;THIS RUNS SPCWAR EVERY 12 TICKS
01600		MOVEI 0,12
01700		MOVEM 0,DISMIS
01800	
01900		SKIPN FLAG
02000		JRST OLDBUF
02100		MOVE 3,[XWD MBOX,CMDBUF]
02200		BLT 3,CMDBUF+37
02250		SETZM FLAG
03200	OLDBUF:	MOVE CMD,CMDBUF	;WHERE ARE WE IN THE BUFFER
03300		SOSLE CMDTIM	;DO WE CARE?
03400		JRST CCOMP	;NO, WE CANT DO ANYTHING ANYWAY
03500		AOBJP CMD,CCOMP	;ARE WE FINISHED WITH THE SEQUENCE?
03600		MOVEM CMD,CMDBUF	;NO, SAVE FOR NEXT TIME
03700		MOVE 2,(CMD)	;GET THE NEXT COMMAND
03800		MOVEI 1,0
03900		LSHC 1,3	;GET THE DEVICE BITS IN AC1
04000		LSH 2,-3	;TIME IN LH,,COMMAND IN RH
04100		HLRZM 2,CMDTIM	;SAVE THE TIME
04200		HRREM 2,@PLACE-1(1)	;SAVE THE COMMAND
04300		JRST OLDBUF	;TRY AGAIN
04400	PLACE:	BKANG
04500		CAMANG
04600		FRANG
04700		DRCMD
04800		-1↔-1↔-1	;FLUSH THE LOSERS
     

00100	PULSE:	0	;CALCULATES DAC VOLTAGE TO MAKE GIVEN WIDTH
00200		MOVE 2,PULSW	;FORMULA IS:
00300		FDV 2,RC(1)	;V(DAC)=2*SUPPLYVOLTAGE+EPSILON-(VSUPPLY-VBE)*E**(PULSW/RC)
00400		JSA Q,EXP
00500		2
00600		MOVE 3,VSUP
00700		FSB 3,VBE
00800		FMP 3,0
00900		MOVE 2,VSUP
01000		FSC 2,1
01100		FAD 2,EPS(1)
01200		FSB 2,3
01300		FMP 2,[102.4]	;MAKES DAC NUMBER FROM VOLTAGE
01400		FIX6 2,233000	;FIX IT	,THIS LOC IS MODIFIED BY THE PROG.
01500		DPB 2,[POINT 10,BKW51(1),27]
01600		JRST @PULSE
     

00100	CCOMP:	MOVE 2,BKANG		;CCOMP CONTAINS THE ALGORITHM FOR COMPUTING DAC
00200		MOVM 3,2	;LAST CHECK OF ANGLE
00300		CAILE 3,=360	;TOO BIG?
00400		JRST -1
00500		FSC 2,233	;FLOAT THE ANGLE
00600		FDV 2,[360.0]	;GET FRACTION OF TOTAL ROTATION
00700		MOVE 3,CPULS	;CENTER WIDTH
00800		FSB 3,CPMAX	;TOTAL DELTA WIDTH
00900		FMP 2,3		;FOR THIS ANGLE
01000		FAD 2,CPULS	;GET TOTAL WIDTH
01100		MOVEM 2,PULSW
01200		MOVEI 1,0
01300		JSR PULSE
01400		MOVE 2,FRANG		;THIS ROUTINE RUNS IN SPCWAR MODE
01500		MOVM 3,2	;LAST CHECK OF FRONT
01600		CAILE 3,=360	;TOO BIG?
01700		JRST -3
01800		FSC 2,233	;FLOAT THE ANGLE
01900		FDV 2,[360.0]	;GET FRACTION OF TOTAL ROTATION
02000		MOVE 3,CPULS	;CENTER WIDTH
02100		FSB 3,CPMAX+2	;TOTAL DELTA WIDTH
02200		FMP 2,3		;FOR THIS ANGLE
02300		FAD 2,CPULS	;GET TOTAL WIDTH
02400		MOVEM 2,PULSW
02500		MOVEI 1,2
02600		JSR PULSE
02700		MOVE 2,CAMANG
02800	CAMCK:	CAILE 2,=270
02900		JRST CAM1
03000		CAMGE 2,[-=90]
03100		JRST CAM2
03200		MOVEM 2,CAMANG
03300		SUBI 2,=90	;CHANGE RANGE TO +/-180
03400		MOVM 3,2	;LAST CHECK ON CAMERA
03500		CAILE 3,=180	;TOO BIG?
03600		JRST -2
03700		FSC 2,233	;FLOAT THE ANGLE
03800		FDV 2,[180.0]	;GET FRACTION OF TOTAL ROTATION
03900		MOVE 3,CPULS	;CENTER WIDTH
04000		FSB 3,CPMAX+1	;TOTAL DELTA WIDTH
04100		FMP 2,3		;FOR THIS ANGLE
04200		FAD 2,CPULS	;GET TOTAL WIDTH
04300		MOVEM 2,PULSW
04400		MOVEI 1,1
04500		JSR PULSE
04600		MOVEI 2,500000	;HERE CALCULATE DRIVE VOLTAGE
04700		SKIPN DRCMD
04800		ADDI 2,40000	;DRCMD=1 OR 2 MEANS GO
04900		HRRM 2,DR54
05000		DATAO 700,BKW51
05100		DATAO 700,CAM52
05200		DATAO 700,FRW53
05300		DATAO 700,DR54
05400		CALLI
05700	
05800	CAM1:	SUBI 2,=180
05900		JRST CAMCK
06000	CAM2:	ADDI 2,=180
06100		JRST CAMCK
06300	END CARCON